// 发布订阅模式和观察者有点类似，但是发布订阅有统一的调度中心，每一个事件可以多个订阅
class EventEmitter {
    constructor() {
        this.cache = {};
    }

    // 订阅事件
    on(name, cb) {
        if(!this.cache[name]) {
            this.cache[name] = [];
        }
        this.cache[name].push(cb);
    }

    // 关闭事件
    off(name, cb) {
     const task = this.cache[name];
     if(!task) {
        console.log('没有找到对应事件')
     }
     const index = task.findIndex(item => item === cb);
     if(index !== -1) {
         task.splice(index, 1);
     }
    }

    // 触发事件
    emit(name,...args) {
        if(!this.cache[name]) {
            console.log('没有找到对应事件')
        }
        this.cache[name].forEach(cb => cb(...args));
    }

    // 只执行一次的事件
    once(name, cb) {
        const only = (...args) => {
            cb(...args);
            this.off(name, only);
        }
        this.on(name, only);
    }
}

const event = new EventEmitter();

function task1(a, b) {
    console.log('task1', a, b);
}

function task2(a, b) {
    console.log('task2', a+ b);
}

event.on('done', task1);
event.on('done', task2);

event.emit('done', 1, 2);